package cn.skylark.wcm.controller;

import cn.skylark.wcm.common.jwt.JwtUtil;
import cn.skylark.wcm.common.redis.RedisUtils;
import cn.skylark.wcm.common.util.PasswordHelper;
import cn.skylark.wcm.common.util.ReturnMap;
import cn.skylark.wcm.entity.User;
import cn.skylark.wcm.service.RoleResourcesService;
import cn.skylark.wcm.service.UserService;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * 登录页面控制器
 *
 * @author chuhl
 * @since 2017年12月4日14:14:18
 */
@RestController
public class HomeController {
  /** logger */
  private static final Logger LOGGER = LoggerFactory.getLogger(HomeController.class);
  @Autowired
  UserService userService;

  @Autowired
  RedisUtils redisUtils;

  @Autowired
  RoleResourcesService roleResourcesService;

  /**
   * 用户登录
   * 1：以POST方式调用loginAPI接口，并传入登录用户信息
   * 2：如果用户名及密码为空，则系统终止，返回【用户名或密码不能为空】消息
   * 3：调用passwordhelper对传入的登录信息进行加密处理，然后调用userService的login方法，
   *    并取得该用户的角色及详细用户信息
   * 4：取得的用户的角色及详细信息为空时，返回【用户或密码不正确】消息
   * 5：取得的用户角色信息为空时，返回【用户为设定角色】消息
   * 6：都不为空时，返回【登录成功】，并返回该用户的角色及详细信息
   * @param user 用户实体
   * @return 返回结果对象
   */
  @RequestMapping(value = "/login", method = RequestMethod.POST)
  public String login(HttpServletRequest request, User user) throws Exception {
    LOGGER.info( "用户登录--开始 username="+ user.getUsername()+ ", password="+ user.getPassword() );
    ReturnMap ret = new ReturnMap();
    if (StringUtils.isEmpty(user.getUsername()) || StringUtils.isEmpty(user.getPassword())) {
      ret.setFlg( 1 );
      ret.setMessage("用户名或密码不能为空！"  );
      return  ret.ReturnMap();
    }
    PasswordHelper passwordHelper = new PasswordHelper();
    user.setPassword( passwordHelper.encrypt( user.getPassword()) );
    Map<String ,Object> data = userService.login( user );
    if(data.isEmpty() || data.size() == 0){
      ret.setFlg( 1 );
      ret.setMessage("用户或密码不正确！"  );
      return  ret.ReturnMap();
    } else {
      if(data.get( "role" ) == null){
        ret.setFlg( 1 );
        ret.setMessage("用户未设定角色！"  );
      } else {
        ret.setFlg( 0 );
        ret.setMessage("登录成功！"  );
        JwtUtil jwtUtil=new JwtUtil();
        User userToken =(User)data.get( "user" );
        data.put( "token", jwtUtil.generateToken( userToken ) );
        redisUtils.set( "token|"+request.getSession().getId(),jwtUtil.generateToken( userToken ) ,JwtUtil.EXPIRATION_TIME);
        ret.setData( JSONObject.fromObject( data ).toString() );
      }
      LOGGER.info( "用户登录--结束" );
      return  ret.ReturnMap();
    }
  }

  /**
   * 获取所有角色权限详细信息
   * 1：调用roleResourcesService获取角色权限详细信息
   * 2：将角色权限信息放入返回值对象
   * @param tenanid 租户ID
   * @return 返回值对象
   */
  @RequestMapping(value = "/roleResources")
  public String roleResoureces(Integer tenanid){
    LOGGER.info( "获取角色权限MAP--开始 tenanid="+ tenanid );
    ReturnMap ret = new ReturnMap();
    Map<String , Object> retMap = roleResourcesService.getRoleResources( tenanid );
    ret.setFlg( 0 );
    ret.setMessage( "角色权限获取成功！" );
    ret.setData( JSONObject.fromObject( retMap ).toString() );
    LOGGER.info( "获取角色权限MAP--结束");
    return ret.ReturnMap();
  }

/**
 * 退出系统
 * 1:取得的当前请求sessionid
 * 2:删除redis服务器上对应sessionid的TOKEN内容
 */
  @RequestMapping(value = "/logout", method = RequestMethod.POST)
  public void logout(HttpServletRequest request){
    LOGGER.info( "退出系统--开始");
    if(redisUtils.exists( "token|"+request.getSession().getId() )) {
        redisUtils.remove( "token|" + request.getSession().getId() );
    }
    LOGGER.info( "退出系统--结束");
  }
}
